package com.hugang.designmode.factory;

/**
 * 工厂模式——抽象工厂模式
 * 抽象工厂模式：考虑多等级产品的生产，将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族，
 * 是工厂方法模式的升级版本。工厂方法模式只生产一个等级的产品，而抽象工厂模式可生产多个等级的产品。
 * 优点：
 * 可以在类的内部对产品族中相关联的多等级产品共同管理，而不必专门引入多个新的类来进行管理。
 * 当增加一个新的产品族时不需要修改原代码，满足开闭原则。
 * 缺点：
 * 当产品族中需要增加一个新的产品时，所有的工厂类都需要进行修改。
 *
 * @author hg
 * @date 2020/6/13 11:53
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        AbstractFactory haierFactory = new HaierFactory();
        AirCondition haierAirCondition = haierFactory.getAirCondition();
        Television haierTelevision = haierFactory.getTelevision();
        haierAirCondition.show();
        haierTelevision.show();

        AbstractFactory tclFactory = new TclFactory();
        AirCondition tclAirCondition = tclFactory.getAirCondition();
        Television tclTelevision = tclFactory.getTelevision();
        tclAirCondition.show();
        tclTelevision.show();
    }

}

/**
 * 空调接口
 *
 * @author hg
 * @date 2020/6/13
 */
interface AirCondition {
    /**
     * 显示空调信息
     */
    void show();
}

/**
 * 电视机接口
 */
interface Television {

    /**
     * 显示电视机信息
     */
    void show();
}

/**
 * 海尔空调
 */
class HaierAirCondition implements AirCondition{

    @Override
    public void show() {
        System.out.println("海尔空调");
    }
}

/**
 * 海尔电视机
 */
class HaierTelevision implements Television{

    @Override
    public void show() {
        System.out.println("海尔电视机");
    }
}

class TclAirCondition implements AirCondition{

    @Override
    public void show() {
        System.out.println("tcl空调");
    }
}

class TclTelevision implements Television{

    @Override
    public void show() {
        System.out.println("tcl电视机");
    }
}

/**
 * 抽象工厂接口
 *
 * @author hg
 * @date 2020/6/13
 */
interface AbstractFactory{
    /**
     * 获取空调
     * @return
     */
    AirCondition getAirCondition();

    /**
     * 获取电视机
     * @return
     */
    Television getTelevision();
}

/**
 * 海尔工厂
 * 
 * @author hg
 * @date 2020/6/13
 */
class HaierFactory implements AbstractFactory{

    @Override
    public AirCondition getAirCondition() {
        return new HaierAirCondition();
    }

    @Override
    public Television getTelevision() {
        return new HaierTelevision();
    }
}

/**
 * tcl工厂
 * 
 * @author hg
 * @date 2020/6/13
 */
class TclFactory implements AbstractFactory{

    @Override
    public AirCondition getAirCondition() {
        return new TclAirCondition();   
    }

    @Override
    public Television getTelevision() {
        return new TclTelevision();
    }
}